<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>和 Elasticsearch 交互 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/_talking_to_elasticsearch.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/_talking_to_elasticsearch.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/_talking_to_elasticsearch.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/_talking_to_elasticsearch.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="getting-started.html">基础入门</a></span>
»
<span class="breadcrumb-link"><a href="intro.html">你知道的, 为了搜索…​</a></span>
»
<span class="breadcrumb-node">和 Elasticsearch 交互</span>
</div>
<div class="navheader">
<span class="prev">
<a href="running-elasticsearch.html">« 安装并运行 Elasticsearch</a>
</span>
<span class="next">
<a href="_document_oriented.html">面向文档 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="_talking_to_elasticsearch"></a>和 Elasticsearch 交互<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/010_Intro/15_API.asciidoc">edit</a>
</h2>
</div></div></div>
<p>和 Elasticsearch 的交互方式取决于你是否使用 Java。</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_java_api"></a>Java API<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/010_Intro/15_API.asciidoc">edit</a>
</h3>
</div></div></div>
<p>如果你正在使用 Java，在代码中你可以使用 Elasticsearch 内置的两个客户端：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
节点客户端（Node client）
</span>
</dt>
<dd>
节点客户端作为一个<em>非数据节点</em>加入到本地集群中。换句话说，它本身不保存任何数据，但是它知道数据在集群中的哪个节点中，并且可以把请求转发到正确的节点。
</dd>
<dt>
<span class="term">
传输客户端（Transport client）
</span>
</dt>
<dd>
轻量级的传输客户端可以将请求发送到远程集群。它本身不加入集群，但是它可以将请求转发到集群中的一个节点上。
</dd>
</dl>
</div>
<p>两个 Java 客户端都是通过 <em>9300</em> 端口并使用 Elasticsearch 的原生 <em>传输</em> 协议和集群交互。集群中的节点通过端口 9300 彼此通信。如果这个端口没有打开，节点将无法形成一个集群。</p>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>Java 客户端作为节点必须和 Elasticsearch 有相同的 <em>主要</em> 版本；否则，它们之间将无法互相理解。</p>
</div>
</div>
<p>更多的 Java 客户端信息可以在 <a href="https://www.elastic.co/guide/en/elasticsearch/client/index.html" class="ulink" target="_top">Elasticsearch Clients</a> 中找到。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_restful_api_with_json_over_http"></a>基于HTTP协议的JSON格式的 RESTful API<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/010_Intro/15_API.asciidoc">edit</a>
</h3>
</div></div></div>
<p>所有其他语言可以使用 RESTful API 通过端口 <em>9200</em> 和 Elasticsearch 进行通信，你可以用你最喜爱的 web 客户端访问 Elasticsearch 。事实上，正如你所看到的，你甚至可以使用 <code class="literal">curl</code> 命令来和 Elasticsearch 交互。</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>Elasticsearch 为以下语言提供了官方客户端 —​ Groovy、JavaScript、.NET、 PHP、 Perl、 Python 和 Ruby —​ 还有很多社区提供的客户端和插件，所有这些都可以在 <a href="https://www.elastic.co/guide/en/elasticsearch/client/index.html" class="ulink" target="_top">Elasticsearch Clients</a> 中找到。</p>
</div>
</div>
<p>一个 Elasticsearch 请求和任何 HTTP 请求一样由若干相同的部件组成：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">curl -X&lt;VERB&gt; '&lt;PROTOCOL&gt;://&lt;HOST&gt;:&lt;PORT&gt;/&lt;PATH&gt;?&lt;QUERY_STRING&gt;' -d '&lt;BODY&gt;'</pre>
</div>
<p>被 <code class="literal">&lt; &gt;</code> 标记的部件：</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">VERB</code>
</p>
</td>
<td valign="top">
<p>
HTTP 相关的<em>方法</em>或<em>谓词</em>: <code class="literal">GET</code>、 <code class="literal">POST</code>、 <code class="literal">PUT</code>、 <code class="literal">HEAD</code> 或者 <code class="literal">DELETE</code>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">PROTOCOL</code>
</p>
</td>
<td valign="top">
<p>
<code class="literal">http</code> 或者 <code class="literal">https</code>（如果你在 Elasticsearch 前面有一个 <code class="literal">https</code> 代理）
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">HOST</code>
</p>
</td>
<td valign="top">
<p>
Elasticsearch 集群中任意节点的主机名，或者用 <code class="literal">localhost</code> 代表本地机器上的节点。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">PORT</code>
</p>
</td>
<td valign="top">
<p>
运行 Elasticsearch HTTP 服务的端口号，默认是 <code class="literal">9200</code> 。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">PATH</code>
</p>
</td>
<td valign="top">
<p>
API 的终端路径（例如 <code class="literal">_count</code> 将返回集群中文档数量）。Path 可能包含多个组件，例如：<code class="literal">_cluster/stats</code> 和 <code class="literal">_nodes/stats/jvm</code> 。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">QUERY_STRING</code>
</p>
</td>
<td valign="top">
<p>
任意可选的查询字符串参数 (例如 <code class="literal">?pretty</code> 将<em>格式化输出</em> JSON格式的返回信息，使其更容易阅读)
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">BODY</code>
</p>
</td>
<td valign="top">
<p>
一个 JSON 格式的请求体 (如果请求需要的话)
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>例如，计算集群中文档的数量，我们可以用这个:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}
'</pre>
</div>
<p>Elasticsearch 返回一个 HTTP 状态码（例如：<code class="literal">200 OK</code>）和（除`HEAD`请求）一个 JSON 格式的返回值。前面的 <code class="literal">curl</code> 请求将返回一个像下面这样的 JSON 体：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
    "count" : 0,
    "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
    }
}</pre>
</div>
<p>在返回结果中没有看到 HTTP 头信息，是因为我们没有要求<code class="literal">curl</code>显示它们。想要看到头信息，需要结合 <code class="literal">-i</code> 参数来使用 <code class="literal">curl</code> 命令：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">curl -i -XGET 'localhost:9200/'</pre>
</div>
<p>在书中剩余的部分，我们将用简写格式来展示这些 <code class="literal">curl</code> 示例，它省略了请求中所有相同的部分，例如主机名、端口号以及 <code class="literal">curl</code> 命令本身。而不是显示一个完整的请求，比如：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">curl -XGET 'localhost:9200/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}'</pre>
</div>
<p>我们将用简写格式显示：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /_count
{
    "query": {
        "match_all": {}
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/010_Intro/15_Count.json"></div>
<p>事实上， <a class="xref" href="running-elasticsearch.html#sense" title="安装 Sense">Sense 控制台</a> 也使用相同的格式。如果你正在阅读这本书的在线版本,可以通过点击 Sense 链接视图在 Sense 上打开和运行示例代码。
<span style="color:#666; font-size:80%;">(译者注: 本地版本中没有导入完整的js, 所以在示例代码块下面都没有 "Copy as curl" 和 "View in Sense"按钮)</span>
</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="running-elasticsearch.html">« 安装并运行 Elasticsearch</a>
</span>
<span class="next">
<a href="_document_oriented.html">面向文档 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>